/**
 * @content 查询条件定义功能组件
 * @author  2019-09-16
 */
import { NativeModules } from 'react-native';

let QD = NativeModules.JSQueryDef;

/**
 * @class QueryDef
 * @description 扩展字段头
 */
export default class QueryDef {
  /**
   * 构造一个新的 QueryDef 对象。
   * @memberOf QueryDef
   * @returns {Promise.<QueryDef>} QueryDef 对象。
   */
  async createObj() {
    try {
      var { QueryDefId } = await QD.createObj();
      var queryDef = new QueryDef();
      queryDef._MGQueryDefId = QueryDefId;
      return queryDef;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 设置属性查询条件
   * @memberOf QueryDef
   * @param whereClause 属性查询条件
   * @return {Promise} 成功:>0;失败：<=0
   */
  async setFilter(whereClause) {
    try {
      return await QD.setFilter(this._MGQueryDefId, whereClause);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 属性相关选项设置,设置查询结果字段集
   * @memberOf QueryDef
   * @param flds 查询结果字段集
   * @return {Promise} 成功:>0;失败：<=0
   */
  async setSubFields(flds) {
    try {
      return await QD.setSubFields(this._MGQueryDefId, flds._MGFieldsId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 矩形范围查询条件
   * @memberOf QueryDef
   * @param rect 矩形范围
   * @param queryMode 空间查询模式
   * @return {Promise} 成功:>0;失败：<=0
   */
  async setRect(rect, queryMode) {
    try {
      return await QD.setRect(this._MGQueryDefId, rect._MGRectId, queryMode);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 设置空间查询条件
   * @memberOf QueryDef
   * @param geom 空间查询条件
   * @param queryMode 空间查询模式
   * @return {Promise} 成功:>0;失败：<=0
   */
  async setSpatial(polygon, queryMode) {
    try {
      return await QD.setSpatial(
        this._MGQueryDefId,
        polygon._MGGeoPolygonId,
        queryMode
      );
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * Near点查询
   * @memberOf QueryDef
   * @param dot 点坐标
   * @param xmax x最大值
   * @param xmin x最小值
   * @return {Promise} 成功:>0;失败：<=0
   */
  async setNear(dot, xmax, xmin) {
    try {
      return await QD.setNear(this._MGQueryDefId, dot._MGDotId, xmax, xmin);
    } catch (e) {
      console.error(e);
    }
  }
}
